#include <iostream>

using namespace std;

// void Func(int &a) { cout << "左值引用 : void Func(int &a)" << endl; }
// void Func(int &&a) { cout << "右值引用 : void Func(int &&a)" << endl; }

// int main() {
//   int a = 10;
//   int b = 20;

//   Func(a);      // 左值引用 : void Func(int &a)
//   Func(a + b);  // a+b为临时对象 右值引用 : void Func(int &&a)
//   return 0;
// }

// 将亡值例子

// class Myclass{
//     public:
//     Myclass(int _a,int _b):a(_a),b(_b){}
//     ~Myclass(){}

//     Myclass return_Myclass(Myclass &mc) { return *this; }

//    private:
//     int a;
//     int b;
// };
// int main() {
//     Myclass m1(1,2);
//     Myclass m2 = move(m1);
//     return 0;
// }

//----------------------------

// class myclass {
//  public:
//  myclass (int _a = 10,int _b = 20):a(_a),b(_b){}

//   private:
//   int a;
//   int b;
// };

// int main() {
//   myclass m1;
//   myclass &&m2 = move(m1);//发生移动
//   return 0;
// }

//-----------------------

// class Myclass {
//     public:
//      Myclass(int _value = 10) : data(new int(_value)) { cout << *data <<
//      endl; }

//      ~Myclass(){
//         if(data!=nullptr){
//           delete data;
//         }
//      }
//      int *data;
// };

// int main() {
//   Myclass m1;
//   Myclass &&m2 = move(m1);
//   return 0;
// }

//------------------------

// class Myclass {
//  public:
//   Myclass(int _value = 10) : data(new int(_value)) {
//     cout << *data << endl;
//   }

//   Myclass(const Myclass& other) : data(new int(*other.data)) {}

//   Myclass ToAdd(int val) {
//     *data += val;
//     return *this;
//   }

//   ~Myclass() {
//     if (data != nullptr) {
//       delete data;
//     }
//   }

//   int* data;
// };

// int main() {
//   Myclass m1;
//   Myclass m2 = m1.ToAdd(10);
//   return 0;
// }

//------------------------
// #include<algorithm>
// class Myclass {
//  public:
//   Myclass(int _value = 10) : data(_value) {
//     cout << "Myclass(int _value = 10)" << endl;
//   }

//   Myclass(const Myclass& other) : data(other.data) {
//     cout << "Myclass(const Myclass& other)" << endl;
//   }

//   Myclass(Myclass&& other):data(0) {
//      ::swap(other.data,data);
//      cout << " Myclass(Myclass&& other)" << endl;
//   }  // 移动构造

//   Myclass ToAdd(int val) {
//     data += val;
//     return move(*this);
//   }


//   int data;
// };

// int main() {
//   Myclass m1;
//   Myclass m2(m1.ToAdd(10));
//   return 0;
// }

///----

// class MyObject {
//  public:
//   MyObject() { cout << "Constructor" << endl; }
//   MyObject(const MyObject& other) {
//     cout << "Copy constructor" << endl;
//   }
//   MyObject(MyObject&& other) noexcept {
//     cout << "Move constructor" << endl;
//   }
// };

// int main() {
//   MyObject obj1;                    // 构造函数被调用
//   MyObject obj2 = std::move(obj1);  // 移动构造函数被调用
//   return 0;
// }

///----

class Myclass {
 public:
  Myclass(int _value = 10) : data(_value) {
    cout << "Myclass(int _value = 10)" << endl;
  }

  Myclass(const Myclass& other) : data(other.data) {
    cout << "Myclass(const Myclass& other)" << endl;
  }

  Myclass(Myclass&& other) : data(0) {
    ::swap(other.data, data);
    cout << " Myclass(Myclass&& other)" << endl;
  }  // 移动构造

  Myclass ToAdd(int val) {
    data += val;
    return *this;//手动move
  }

  int data;
};

int main() {
  Myclass m1;
  Myclass &&m2 = m1.ToAdd(10);
  
  return 0;
}